package com.bit.demo2;

//      面向对象的基本特征:
//      封装:不必要公开的数据成员和方法使用private关键字进行修饰。意义:安全性。
//      继承:对共性的抽取。使用extends关键字进行处理的意义:可以对代码进行重复使用
//      多态:字面上理解:语文层次: 一种事物多种形态（不能作为答案回答）。      在demo3里
//      组合


//      Java 中对于字段和方法共有四种访问权限
//      private: 类内部能访问, 类外部不能访问
//      默认(也叫包访问权限): 类内部能访问, 同一个包中的类可以访问, 其他类不能访问.
//      protected: 类内部能访问, 子类和同一个包中的类可以访问, 其他类不能访问.
//      public : 类内部和类的调用者都能访问

//      继承
//      Animal 这样被继承的类, 我们称为 父类 基类 或 超类 对于像 Cat 和 Bird 这样的类, 我们称为 子类 派生类
//      1、Java当中是单继承，不能同时继承两个类以上的类。包括两个。
//      2、子类构造的同时，要先帮助父类来进行构造。
//      如果一个类不想被继承,我们可以设置为final修饰。final int a = 9;//常量不可以被修改
//      final class A      代表整个类不可以被继承


//      super: [不能出现在静态方法当中]父类对象的引用
//      1.super();//调用父类的构造方法
//      2.super.func();   super.方法
//      3.super.data;    super.属性





import com.bit.demo3.Test;

class Animal {
    public String name;
    public int age;
    protected int count;//protected修饰 子类可以调用

    public Animal(String name,int age) {
        this.name = name;
        this.age = age;
    }

    public void eat() {
        System.out.println(name+"eat()");
        System.out.println(count);
    }
}

class Dog extends Animal{
//      public Dog() {
//          super();
//      }
    public Dog(String name,int age) {
        super(name,age);
    }

}

class Bird extends Animal{
    public String wing;
    public String name;//null  如果子类 和父类有相同的字段 优先使用子类
    // 如果想使用父类可以使用super.属性

    public Bird(String name,int age,String wing) {
        super(name,age);//我的理解是 这里super是给父类赋值  调用的话要使用super.name 并不会给当前类的同名属性赋值
        this.wing = wing;
    }

    public void fly() {
        System.out.println(name+"fly()");//null fly()
        System.out.println(super.name+"fly()");//heihei fly()
    }
}

public class TestDemo {
    public int val = 10;
    protected int val2 = 99;


//      组合: a part of 一部分
//      学校: 学生和老师
    public class Student{
    }
    public class Teacher{
    }
    public class School{
        public Student[] students;
        public Teacher[] teachers;
    }



    public static void main(String[] args) {
//        Dog dog = new Dog("haha",19);
//        System.out.println(dog.name);
//        dog.eat();

        Bird bird = new Bird("heihei",18,"我要的飞");
//        System.out.println(bird.name);
//        bird.eat();
        bird.fly();
    }

    public static void main2(String[] args) {
        Bird bird = new Bird("heihei",18,"我要的飞");
        System.out.println(bird.name);
        bird.fly();
    }

    public static void main3(String[] args) {
        Bird bird = new Bird("heihei",18,"我要的飞");
        System.out.println(bird.count);
    }

    public static void main4(String[] args) {
//        Dog dog = new Dog("haha",19);
//        Animal animal = dog;  等于下面那行代码
        Animal animal = new Dog("haha",19);// 向上转型：父类引用  引用子类对象 在demo3内
    }

}